
// Linked list element
typedef struct LNode {
	int id;
	int data;
	struct LNode *next;
	struct LNode *prev;
} LNode;
LNode *newNode(int data);
void setNodeData(LNode *node, int n);
void dumpNode(LNode *node);
void deleteNode(LNode *node);
int hasNext(LNode *node);

// Linked list 
typedef struct List {
	LNode *head;
	LNode *tail;
	int size;
} List;
List *newList(LNode *head);
LNode *getHead(List *l);
LNode *getTail(List *l);
void addInHead(List *l, LNode *n);
void addinTail(List *l, LNode *n);
LNode *removeTail(List *l);
LNode *removeHead(List *l);
void deleteList(List *l);

// List iterator
typedef struct LIterator {
	List *list;
	LNode *current;
} LIterator;
LIterator *newIterator(List *l);
int moveNext(LIterator *itr);
int movePrev(LIterator *itr);
void dumpTraverse(LIterator *itr);
//TODO : add map(itr, callback);

